package object;


/**
 * 多态：对象的多种形态
 * 多态条件：有继承/实现的关系，有父类引用指向子类，有方法重写
 * 使用父类型作为参数类型，可以接受所有子类型，体现多态的扩展与便利
 */

class Monkey {
	private String name;
	private int age;

	public Monkey() {
	}

	public Monkey(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public int getAge() {
		return age;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public void show() {
		System.out.println("Name: " + name + " Age: " + age);
	}
}

class Jason extends Monkey {
	@Override
	public void show() {
		// 这里直接调用父类的方法，如果方法前没有this就会在当前类找，当前类没有就去父类找
		System.out.println("猴子1：" + getName() + "," + getAge());
	}
}

class Lili extends Monkey {
	@Override
	public void show() {
		System.out.println("猴子:2：" + getName() + "," + getAge());
	}
}

public class PolyClass {
	public static void main(String[] args) {
		Jason js = new Jason();
		js.setName("jason");
		js.setAge(20);

		Lili li = new Lili();
		li.setName("lili");
		li.setAge(30);

		// 使用父类型作为参数类型，可以接受所有子类型，多态最直观的体现了
		Monkey kk = new Lili();

		monkeyShow(js);
		monkeyShow(li);
	}

	public static void monkeyShow(Monkey m) {
		m.show();
	}
}
